<?php namespace app\system\controller;
use houdunwang\db\Db;
use houdunwang\dir\Dir;
use houdunwang\route\Controller;
use houdunwang\view\View;
use system\model\Module as ModuleModel;
use houdunwang\request\Request;
use houdunwang\validate\Validate;
class Module extends Common
{
	//创建构造函数来进行登录的验证，加载中间件函数，和加载分配数据函数
	public function __construct()
	{
		//加载中间件函数
		$this->auth();
		//加载分配数据的函数
		$this->assignModuleData();
	}
	//创建分配变量的函数
	public function assignModuleData(){
		//首先从数据库中获得数据
		$moduleData=Db::table('module')->where('module_is_system',0)->get();
//		p($moduleData);die();
		//然后将数据分配到页面中(这里应该注意的是这里不是再次调用末班了，而是直接分配数据了)(然后到前台页面判断是否有友情链接数据进行if判断，若是有就显示出来数据)
		View::with('moduleData',$moduleData);

	}
	//动作
	public function index(ModuleModel $module)
	{
		//此处书写代码...
		//获得旧数据
//		$field=$module->where('module_is_system',0)->paginate(1);
//		return view('',compact('field'));
		//06-27的作业
		//06-27.2就是想向数据库中扫描一下addons也就是自定义的模块也就是module_is_system=0的模块，看看有哪些模块，搜描出来的这些模块就证明已经安装了；所以给已经安装了的模块添加一个字段表示
		$isInstalledModule=ModuleModel::where('module_is_system',0)->lists('module_name');
//		p($isInstalledModule);die();//pluck打印的知识adfs，是满足条件的第一条记录
//		Array
//		(
//			[0] => adfs
//		)
		//然后扫描一下看看此时addons目录中有哪些模块
		$modules=Dir::tree('addons');
//		p($module);die;下面使其打印的结果
//		Array
//		(
//			[0] => Array
//			(
//				[path] => addons/adfs
//					[type] => dir
//	[dirname] => addons
//	[basename] => adfs
//	[filename] => adfs
//	[extension] =>
//            [filemtime] => 1497400938
//            [fileatime] => 1498565166
//            [size] => 431
//            [iswrite] => 1
//            [isread] => 1
//        )
		//然后就是循目录中的模块看看数据库中的模块是否有目录中的模块，如果存在就给诶只文件中添加一个标识变量，如果存在就是1，不存在就是0；所以判断存不存在使用的是in_array();

		foreach($modules as $k=>$v){
			//首先还要判断一下是否是合法的模板,判断的标准就是是否存在manifest.php这个文件
			$manifestFile = 'addons/' . $v[ 'basename' ] . '/manifest.php';
			if(is_file($manifestFile)){
				//引进配置文件中的内容，因为配置文件中的内容主要就是一个数组，是返回一个数组，所以通过include引进改文件就是接受数组的返回值
				$config=include $manifestFile;
				//然后为这个数组添加一个变量进行表示，根据数组中有没有目录中的恶魔快的名字
				$config['isinstall']=in_array($v['basename'],$isInstalledModule);
//				p($config);die();下面使其打印的结果
//				Array
//				(
//					[csrf_token] =>
//						[module_title] => 友情链接
//				[module_name] => links
//				[module_author] => houdunrenwubin
//				[module_thumb] => attachment/2017/06/24/29671498289776.jpg
//				[module_introduction] => 这是新创建的一个模块
//				[install] =>
//)
//				然后将这些数据都复制到一个数组中,所以应先定义一个数组，这里应注意的是在外面声明数组，当不可以在里面定义数组
				$data[]=$config;
//				p($data);die();下面使其打印的结果，然后就是这个$data[]里面获得的是所有符合条件的数据；
//				Array
//				(
//					[0] => Array
//					(
//						[csrf_token] =>
//							[module_title] => 友情链接
//				[module_name] => links
//				[module_author] => houdunrenwubin
//				[module_thumb] => attachment/2017/06/24/29671498289776.jpg
//				[module_introduction] => 这是新创建的一个模块
//				[install] =>
//        )
//
//)
			}
		}
		//上面获得了$data的数组以后就是将数据分配到前台了，分配完数据后就是进行安装模块了
		return view('',compact('data'));
	}


	//设计模块
	public function design(ModuleModel $module)
	{

		if (IS_POST) {
			//1.接受post提交的数据
			$post = Request::post();
			//2.进行不为空的验证
			Validate::make([
				['module_title', 'required', '请输入模块中文名称', Validate::MUST_VALIDATE],
				[ 'module_name' , 'required' , '请输入模英文标识' , Validate::MUST_VALIDATE ] ,
				[ 'module_name' , 'regexp:/^[a-z]{3,10}$/' , '模块标识必须为英文字母' , Validate::MUST_VALIDATE ] ,
			]);
			//2.进行判断不能重复创建模块
			//考虑规范，采用目录全部小写
			//因为在前台里面有模块的英文项，这一项就是模块的名字就是目录的名字。
			$post['module_name'] = strtolower($post['module_name']);
			//在addons或者module检测，创建的模块已存在，则不允许重复创建【目录已经存在，代表是模块已经存在】
			if(is_dir("addons/{$post['module_name']}") || is_dir("module/{$post['module_name']}")){
				return ['valid'=>0,'message'=>'模块已存在，不能重复创建'];
			}
			//3.创建出模块的基本目录结构
			//3.创建出模块的基本目录结构
			$dirs = [
				'controller','model','system','template',
			];
			foreach ($dirs as $dir) {
				//Dir::create（）在hdphp手册中组件--目录操作
				Dir::create("addons/{$post['module_name']}/{$dir}");
			}
			//4.生成文件
			$module_name = $post['module_name'];
			$content = <<<str
<?php namespace addons\\{$module_name}\system;

use module\Hdprocessor;

/**
 * 微信处理器
 * Class Processor
 * @package addons\\{$module_name}\system
 */
class Processor extends Hdprocessor
{
	public function handler()
	{

	}
}
str;
			file_put_contents("addons/{$post['module_name']}/system/Processor.php",$content);
//			5.将数据存到数据库中
//			$module->save($post);
//2016-06-27:今天的任务就是从这里开始的，就是实现在没有安装模块的时候是不允许将模块的数据写入到数据库；然后将模块安装成功以后才将添加模块的数据写入到数据库；
			//然后方法就是在添加模块以后将post提交的数据存储到自己设定的配置文件中；
//			所以在创建目录的时候也要创建一个配置文件
			file_put_contents( 'addons/' . $module_name . '/manifest.php' , "<?php\r\nreturn " . var_export( $post , true ) . ";\r\n?>" );
			return ['valid'=>1,'message'=>'模块设计成功'];
		}
		return view();
	}//设计模块结束

//	安装模块
	public function install(ModuleModel $module){
		//首先获得get参数，因为这里要根据get参数中的模块的名字来拼接数据,然后这里是将配置文件中的额数据存入到数据库中，所以萤爱拼接目录的路径
		$module_name=Request::get('module_name');
		//拼接路径，获得配置文件的数据
		$data=include 'addons/'.$module_name.'/manifest.php';
		//将数据存入到数据库中
		$module->save($data);
		//进行存入成功的提示
		 return $this->setRedirect('index')->success('安装成功');
	}
	//卸载模块
	public function uninstall(){
		//获得传递的参数就是模块的名字
		$module_name=Request::get('module_name');
//		echo $module_name;die;haha
		//将对应的模块删除--到手册中搜索目录操作
//		Dir::del('Home');
//		Dir::del("addons/{$module_name}");//这里注意使用双引号解析变量,这里的目录要留着，就是要是想删除目录就应该手动进行删除
		//将数据库中的数据删除--搜索：delete（）；在核心操作中
		ModuleModel::where('module_name',$module_name)->delete();
		//进行成功提示
		return $this->setRedirect('index')->success('删除成功');
	}
}

